#include "moteurJeu.h"

void MoteurJeu::executer() {
    if (!this->fileMessages.empty()) {
        traiterMessage(this->fileMessages.front());
        this->fileMessages.pop();
    }
}

void MoteurJeu::traiterMessage(Message m) {
    switch (m.getType()) {
        case PIECE_CLIQUEE:
            //partie->traiterPieceCliquee(m);

            // Si on vient de cliquer sur une de nos pieces
            if ((partie->LirePlateau(m.getEntier(0), m.getEntier(1))) != NULL) {
                if (partie->LirePlateau(m.getEntier(0), m.getEntier(1))->getCouleur() == partie->getJoueurActu()) {
                    pieceCliquee = false;
                }
            }
            // Si une piece était déjà selectionnée
            if (pieceCliquee) {
                // Clic dans le vide -> on déselectionne la pièce
                if (partie->LireDepl(m.getEntier(0), m.getEntier(1)) == AUCUN_COUP) {
                    partie->initialiserMatriceDepl();
                    pieceCliquee = false;
                }
                // Clic sur une case autorisée -> déplacement + vérification du plateau + fin du tour
                else {
                    this->SetPieceDeplacee(false);
                    partie->deplacerPiece(partie->LirePlateau(XClique,YClique), m.getEntier(0), m.getEntier(1));

                    // Vérification du plateau après déplacement graphique de la pièce
                    //partie->verifierPlateau();

                    partie->initialiserMatriceDepl();
                    if (this->SiPieceDeplacee()) {
                        this->pieceCliquee = false;
                        
                        if (!attentePromotion)
                            partie->finTour();
                        // sinon le message PROMOTION declenchera le changement de joueur
                    }
                }
            }
            // Si aucune pièce n'était sélectionnée
            else {
                XClique = m.getEntier(0);
                YClique = m.getEntier(1);
                // Clic dans le vide -> rien
                if (partie->LirePlateau(m.getEntier(0), m.getEntier(1)) == NULL)
                    //envoie d'un message pour dire que la case est vide
                    ;//cout<<"Aucune piece sur cette case !"<<endl;
                // Clic sur une pièce
                else {
                    // Si la pièce est de la couleur du joueur actuel -> calcul des deplacements possibles
                    if (partie->LirePlateau(m.getEntier(0), m.getEntier(1))->getCouleur() == partie->getJoueurActu()) {
                        partie->initialiserMatriceDepl();
                        partie->LirePlateau(m.getEntier(0), m.getEntier(1))->calculDeplacements();
                        pieceCliquee = true;
                    }
                    // Si la pièce est une pièce adverse -> rien
                    else
                        ;//cout<<"Vous ne pouvez pas jouez une piece de l'adversaire !"<<endl;
                }
            }

            // l'échiquier à changé
            moteurGraphique->envoyerMessage(Message(ECHIQUIER_MODIFIE));

            break;
        case PIECE_DEPLACEE:
            //partie->traiterPieceDeplacee(m);
            break;
        case CREER_PARTIE:
            traiterCreerPartie(m);
            break;
        case ABANDON_PARTIE:
            traiterAbandonPartie(m);
            break;
        case CHOIX_PROMOTION:
            partie->traiterPromotion(m.getEntier(0));
            break;
    }
}

void MoteurJeu::traiterCreerPartie(Message m) {

    if (m.getNbJoueurs() < 2) {   // si il n'y a aucun joueur dans le message
        // Si il y a une partie en cours, on récupère le nom des joueurs courant et on l'arrête
        if (this->partie != NULL) {
            arreterPartie();
            commencerPartie(jB,jN);
        }
        // Si il n'y avait aucune partie en cours --> PROBLEME
        else
            ;
    }
    else {  // si il y a des joueurs dans le message
        commencerPartie(m.getJoueur(0), m.getJoueur(1));
    }

    Message msg(ECHIQUIER_MODIFIE);
    this->moteurGraphique->envoyerMessage(msg);
}


void MoteurJeu::traiterAbandonPartie(Message m) {
    arreterPartie();
}



void MoteurJeu::commencerPartie(Joueur * jB, Joueur * jN) {
    //partie = new Partie(this/*, nomJN, nomJB*/);

    this->jB = jB;
    this->jN = jN;
    this->XClique = -1;
    this->YClique = -1;
    pieceCliquee=false;
    pieceDeplacee=false;
    attentePromotion=false;
    this->partie = new Partie(this, jB, jN);
    //this->partie->initialiserPartie();
}

void MoteurJeu::arreterPartie() {
    delete partie;
    partie = NULL;
}

Partie * MoteurJeu::getPartie() const {
    return partie;
}

bool MoteurJeu::SiPieceCliquee() const {
    return this->pieceCliquee;
}
bool MoteurJeu::SiPieceDeplacee() const {
    return this->pieceDeplacee;
}
void MoteurJeu::SetPieceDeplacee(bool b) {
    this->pieceDeplacee = b;
}
void MoteurJeu::SetPieceCliquee(bool b) {
    this->pieceCliquee = b;
}
void MoteurJeu::setAttentePromotion(bool b) {
    this->attentePromotion = b;
}

int MoteurJeu::getXClique() const {
    return this->XClique;
}
int MoteurJeu::getYClique() const {
    return this->YClique;
}
